/**
 * 手动模拟一个类似于express.urlencoded这样的中间件，来解析post提交到服务器的表单数据，步骤如下：
 * 1.定义中间件
 * 2.监听req的data事件
 * 3.监听req的end事件
 * 4.使用querystring模块解析请求体数据
 * 5.将解析出来的数据对象挂载到req.body
 * 6.将自定义中间件封装为模块
 */

const express = require('express')
const qs = require('querystring')

const server = express()

// 注册解析表单数据的中间件
server.use((req,res,next)=>{
    // 监听data事件，获取客户端发送到服务器的数据
    // 数据量较大时，无法一次性发完，则客户端会把数据切割后分批发送到服务器。所以data事件可能会触发多次，我们需要拼接完整的数据
    let str = ''
    req.on('data',(chunk)=>{
        str += chunk
    })
    // 客户端发送完毕会触发end事件，此时即可获取完整的参数
    req.on('end',()=>{
        console.log('str',str)
        // 紧接着把字符串格式的请求体数据，解析成对象格式
        const body = qs.parse(str)
        console.log('body',body)
        req.body = body
        next()
    })
})


server.post('/data',(req,res)=>{
    console.log(req.body)
    res.send('finished')
})

server.listen(80,()=>{
    console.log('http://127.0.0.1')
})
